/**
 * Copyright 2007-2008. Chongqing First Information & Network Co., Ltd. All
 * rights reserved. <a>http://www.cqfirst.com.cn</a>
 */
package com.cqcis.uip.base.framework.handlers;

import com.cqcis.uip.base.framework.common.Task;

/**
 * Socket客户端, 应该实现的接口.
 * 该接口的实现必须为线程安全.
 * 
 * task对象可以设置again操作，以允许重复执行task.
 * 1. send, recv中可以可以执行task.setAgain().
 * 2. send 方法中的task.setExecuteDefault()方法指返回null，而又没有设置again，则抛出异常,设置为false,则改变该行为，不抛异常.
 * 3. recv 方法中的task.setExecuteDefault()方法指释放session，进行重用,设置为false，则改变该行为，不释放session.
 * 
 * @author huangmy
 * @date   2007-12-20
 */
public interface ClientService {
	/**
	 * 处理给定的task对应的发送数据, 打包成特定接口对应的数据实例;
	 * 如果处理成功, 返回对应的实例; 如果失败, 必须返回null,表示该task处理失败 
	 * 
	 * @param task
	 * @return
	 * @throws Exception
	 */
	public Object doMessageSend(final Task task) throws Exception;
	
	/**
	 * Session 收到数据后, 对应的数据处理操作;
	 * 
	 * @param message 可能为ControlMsg实例, 此时为控制信息, 且task为一个虚拟的task,由
	 *     Task task = new Task(ControlMsg.class.getName());获取
	 * @param task
	 * @throws Exception
	 */
	public void doMessageReceived(Object message, final Task task) throws Exception;
}
